package com.coderman.infosys.auth.infrast.dao.mapper;

import com.coderman.infosys.auth.infrast.dao.dataobject.RoleUserRelationDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;


/**
 * @Description:角色-用户关联表接口
 * 关于这个关联表，一般来说如果不是特别复杂的话，我觉得可以跟RoleMapper进行合并，既然RoleBO已经主动维护了这个多对多的关系
 * 那么围绕下面的接口方法的操作看上去由RoleMapper操作更合理一点。当然也不是放之四海而皆准的，如果存在另外一个对象跟这俩对象存在更复杂的关系的话，那还是需要看业务操作的实际流程
 * 由谁发起，谁维护。
 * @Author:
 * @CreateTime:2022-01-02 15:27:39
 * @version v1.0
 */
@Mapper
public interface RoleUserMapper {

	/**
	 *
	 * @Description 保存数据记录
	 * @param roleUserRelationDO
	 * @return long
	 */
	long insert(@Param(value = "roleUserRelationDO") RoleUserRelationDO roleUserRelationDO);

	/**
	 *
	 * @Description 根据ID删除单条记录
	 * @param id
	 * @return int
	 */
	int deleteById(@Param(value = "id") Long id);


	/**
	 *
	 * @Description 根据roleCode删除关联关系
	 * @param roleCode
	 * @return int
	 */
	int deleteByRoleCode(@Param(value = "roleCode") String roleCode);

	/**
	 *
	 * @Description 根据roleCode删除关联关系
	 *
	 * 这里需要说明一下就是关于持久层的接口命名的问题，很多情况下我们基本上会以CURD来命名接口方法
	 * 但是在领域里面却很少，或者说有CURD的影子但是我们更容易看出相关的业务操作语意
	 *
	 * 可以看一下关于以RoleBO维护关联关系的时候RoleBO如何构建关联关系，如何解除关联关系，在方法命名上有什么区别
	 *
	 * 通常情况下持久层很少会介入业务层的一些语意，这里由于已经在UserRoleRepository内部进行了关系的建立和解除
	 * 也就是说这种关联关系是依附于RoleBO这个对象的，那么对于此的操作虽然由RoleUserRelationBO和RoleUserMapper来实现，但是操作者确可以认为是整个聚合根的行为
	 * 这也就隐含着一个问题就是:如果存在一对多的场景下这种两个表之间的操作如果组成一个事务，算不算一个小的聚合操作，进而把RoleBO这种主动维护关联关系的对象当作一个聚合根看待呢？
	 * 同理如果一个对象与其他几个对象都是一对多的关系，那这个对象来主动维护关联关系的情况下是不是相关的操作都可以是围着着把这个对象当作聚合根来看待的呢？
	 *
	 * 再延伸一点就是，两个对象之间的关系假设就是一对一或者一对多，那么加入第三个和第四个的情况下是不是仍然一对一和一对多的关系成了，同时有一个稳定的对象作为维护关联关系的主角？
	 *
	 * 所以领域的业务语意操作会延伸到持久层，那么在这种情况下这个持久层接口就有两种含义
	 * 1.代表这是一个数据库表操作
	 * 2.代表从领域操作延伸出来的业务操作
	 * 因此,这个方法命名会显得比上面两种更生动也更容易理解
	 *
	 * 同理我们可以看一下下面的批量接口，命名对比
	 * @param roleCode
	 * @return int
	 */
	int removeRelation(@Param(value = "roleCode") String roleCode);


	int batchInsert(@Param(value = "list")List<RoleUserRelationDO> roleUserRelationDOList);


	int buildRelation(@Param(value = "list")List<RoleUserRelationDO> roleUserRelationDOList);


	/**
	 *
	 * @Description 根据编码获取单条记录
	 * @param roleCode
	 * @return RoleDO
	 */
	List<RoleUserRelationDO> getByRoleCode(@Param(value = "roleCode") String roleCode);

}